"""
文件诊断脚本 - 检查生成的文件位置和命名
"""

import json
from pathlib import Path
import sys


def diagnose_story_directory(story_dir: str):
    """诊断故事目录的文件情况"""
    
    story_dir = Path(story_dir)
    
    print("\n" + "="*60)
    print("📁 文件诊断报告")
    print("="*60)
    
    # 1. 检查目录是否存在
    print(f"\n1. 检查目录: {story_dir}")
    if not story_dir.exists():
        print(f"   ❌ 目录不存在")
        return
    print(f"   ✅ 目录存在")
    
    # 2. 检查会话文件
    print(f"\n2. 检查会话文件")
    session_file = story_dir / ".session.json"
    if session_file.exists():
        print(f"   ✅ 找到会话文件: {session_file}")
        try:
            with open(session_file, 'r', encoding='utf-8') as f:
                session = json.load(f)
            
            if 'pages' in session:
                print(f"   📄 故事页面数: {len(session['pages'])}")
            
            if 'images' in session:
                print(f"   🖼️  图片路径数: {len(session['images'])}")
                print(f"\n   图片路径列表:")
                for idx, img_path in enumerate(session['images'], start=1):
                    if img_path:
                        exists = "✅" if Path(img_path).exists() else "❌"
                        print(f"      {idx}. {exists} {img_path}")
                    else:
                        print(f"      {idx}. ❌ None (未生成)")
        except Exception as e:
            print(f"   ⚠️  读取会话文件失败: {e}")
    else:
        print(f"   ❌ 未找到会话文件")
    
    # 3. 检查 image 目录
    print(f"\n3. 检查 image 目录")
    image_dir = story_dir / "image"
    if image_dir.exists():
        print(f"   ✅ image 目录存在: {image_dir}")
        
        # 列出所有图片文件
        image_files = list(image_dir.glob("*.*"))
        png_files = list(image_dir.glob("*.png"))
        jpg_files = list(image_dir.glob("*.jpg"))
        jpeg_files = list(image_dir.glob("*.jpeg"))
        
        all_images = png_files + jpg_files + jpeg_files
        
        if all_images:
            print(f"   📊 找到 {len(all_images)} 个图片文件:")
            for img in sorted(all_images):
                size_mb = img.stat().st_size / (1024 * 1024)
                print(f"      - {img.name} ({size_mb:.2f} MB)")
        else:
            print(f"   ⚠️  image 目录为空！")
            print(f"   💡 可能的原因:")
            print(f"      1. 图片生成失败")
            print(f"      2. 图片保存到了其他位置")
            print(f"      3. API 调用出错")
    else:
        print(f"   ❌ image 目录不存在")
    
    # 4. 检查 speech 目录
    print(f"\n4. 检查 speech 目录")
    speech_dir = story_dir / "speech"
    if speech_dir.exists():
        print(f"   ✅ speech 目录存在: {speech_dir}")
        
        wav_files = list(speech_dir.glob("*.wav"))
        if wav_files:
            print(f"   🔊 找到 {len(wav_files)} 个语音文件:")
            for wav in sorted(wav_files):
                size_kb = wav.stat().st_size / 1024
                print(f"      - {wav.name} ({size_kb:.1f} KB)")
        else:
            print(f"   ⚠️  speech 目录为空（无语音文件）")
    else:
        print(f"   ❌ speech 目录不存在")
    
    # 5. 检查 cache 目录
    print(f"\n5. 检查 .cache 目录（图片缓存）")
    cache_dir = story_dir / ".cache"
    if cache_dir.exists():
        print(f"   ✅ cache 目录存在: {cache_dir}")
        
        cached_images = list(cache_dir.glob("*.png")) + \
                       list(cache_dir.glob("*.jpg")) + \
                       list(cache_dir.glob("*.jpeg"))
        
        if cached_images:
            print(f"   📦 找到 {len(cached_images)} 个缓存图片:")
            for img in sorted(cached_images):
                size_mb = img.stat().st_size / (1024 * 1024)
                print(f"      - {img.name} ({size_mb:.2f} MB)")
        else:
            print(f"   📦 缓存目录为空")
    else:
        print(f"   ℹ️  cache 目录不存在")
    
    # 6. 搜索所有图片文件
    print(f"\n6. 全局搜索图片文件")
    all_found = []
    for ext in ['*.png', '*.jpg', '*.jpeg']:
        all_found.extend(story_dir.rglob(ext))
    
    if all_found:
        print(f"   🔍 在整个目录树中找到 {len(all_found)} 个图片:")
        for img in sorted(all_found):
            rel_path = img.relative_to(story_dir)
            size_mb = img.stat().st_size / (1024 * 1024)
            print(f"      - {rel_path} ({size_mb:.2f} MB)")
    else:
        print(f"   ❌ 未找到任何图片文件！")
    
    # 7. 建议
    print(f"\n" + "="*60)
    print("💡 建议")
    print("="*60)
    
    if not all_found:
        print("\n❌ 问题：完全没有找到图片文件")
        print("\n可能的原因和解决方案:")
        print("  1. 图片生成 API 调用失败")
        print("     → 检查 API key 是否正确")
        print("     → 检查网络连接")
        print("     → 查看生成日志中的错误信息")
        print("\n  2. 图片保存路径错误")
        print("     → 检查 image_agent.py 中的保存逻辑")
        print("     → 确认 save_path 参数是否正确传递")
        print("\n  3. 重新生成图片:")
        print("     → 进入阶段6 重新生成所有图片")
    
    elif len(all_found) > 0 and not png_files:
        print("\n⚠️  问题：找到图片但不在 image 目录")
        print("\n解决方案:")
        print("  1. 手动移动图片到 image 目录")
        print(f"     → 将图片移动到: {image_dir}")
        print("\n  2. 或者修改 .session.json 中的路径")
        print("     → 更新 'images' 字段为实际路径")
    
    elif len(all_found) < 3:
        print(f"\n⚠️  问题：图片数量不足（只有 {len(all_found)} 个）")
        print("\n解决方案:")
        print("  → 重新运行阶段5生成缺失的图片")
    
    else:
        print("\n✅ 文件结构看起来正常")
        print("\n如果视频生成仍然失败:")
        print("  1. 更新 video_compose_agent.py（使用修复版本）")
        print("  2. 更新 run_interactive.py 的 stage_8 方法")
        print("  3. 确保传入正确的 image_paths 参数")
    
    print("="*60 + "\n")


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("用法: python diagnose_files.py <story_dir>")
        print("\n示例:")
        print("  python diagnose_files.py generated_stories/example")
        sys.exit(1)
    
    story_dir = sys.argv[1]
    diagnose_story_directory(story_dir)
